You'd normally have a set of picons that are named after the various channel/service configuration parameters - that's how they're matched. I didn't build my own picons, I searched the interwebs for a suitable set and simply downloaded them, and tvheadend handled the mapping.
Examples:
/vol0/public/Picons$ ls
1_0_1_10_1_85_C00000_0_0_0.png 1_0_1_6FF7_42A_1_C00000_0_0_0.png
1_0_1_1045_1050_233A_EEEE0000_0_0_0.png 1_0_1_6FFF_436_1_C00000_0_0_0.png
1_0_1_105_2_85_C00000_0_0_0.png 1_0_1_7001_436_1_C00000_0_0_0.png
1_0_1_106_2_85_C00000_0_0_0.png 1_0_1_7002_436_1_C00000_0_0_0.png
1_0_1_1070_7E5_2_11A0000_0_0_0.png 1_0_1_7003_436_1_C00000_0_0_0.png
1_0_1_107_2_85_C00000_0_0_0.png 1_0_1_7004_436_1_C00000_0_0_0.png
1_0_1_1076_7E5_2_11A0000_0_0_0.png 1_0_1_7031_41B_1_C00000_0_0_0.png
... you get the idea. It seems a bit arcane as to exactly how they're named, but it's a combination of frequencies, orientation/orbital position, and so on.