Ciao,
sembra che lo mandi in tilt la chiamata al metodo ListBox1.Items.Clear()
Comunque non dovresti gestire l'evento .SelectedIndexChanged (anche se lo sfruttano in molti per comodità) ma dovresti utilizzare l'evento .ItemCheck. Però in questo caso dovresti usare una classe personalizzata come oggetto Item. 
Ed è normale che bisogna cliccare due volte sulll'item per cambiargli lo stato?
Sì, se hai impostato la proprietà .CheckOnClick su false
Andrea