Меня вот это ещё смущает:
else if (Stage = CDDS_SUBITEM or CDDS_ITEMPREPAINT) or (Stage = CDDS_ITEMPOSTPAINT)
and ((Sender.LVStyle = lvsDetail) or (Sender.LVStyle = lvsDetailNoHeader)) then
begin
and ((Sender.LVStyle = lvsDetail) or (Sender.LVStyle = lvsDetailNoHeader)) then
begin
То-есть, два разных этапа отрисовки обрабатываются в одном блоке. Это, думаю, во-первых, может приводить к двойной отрисовке. Во-вторых, один этап предназначен для рисования, второй - для освобождения ресурсов (или первый для подготовки, а второй - рисования) насколько я понимаю. Но могу и ошибаться.