Je vic možností.
Asi bych sáhnul po TStringGrid případně TDrawGrid + pole, kde budeš držet stav.
Obrázky bych naházel do TImageList - všechny možnosti, případně základní obrázky + průsvitky, které se budou kreslit následně s průhledným pozadím.
V OnDraw gridu bych obrázek do buňky vykreslil přes ImageList.Draw() - tam zadáš jen kam a index obrázku. V případě, kde bude průsvitka zvlášť vykreslíš základ a přes to ještě jednou jen průsvitku.
Grid ti umožní panel rozdělit na čtverce a poskládat, jak potřebuješ, pak jen potřebuješ držet obsah jednotlivých čtverců.
O vlastní vykreslování se pak starat nebudeš, grid bude vědět, který index má pro buňku použít a jestli tam má navíc nakreslit průsvitku.
Ty jen nastavíš podmínky pro vykreslení - v cyklu nastavíš příznak a zavoláš grid.update
Tvůj současný problém je vytváření obrázků a ještě do nich pak láduješ obrázky - tohle je hodně pomalé.
P.S.
To už je hodně dávno, kdy jsme se učili releové zabezpečovací zařízení, adjustovali kontakty relátek a hledali v úvazech problém...