Provo a fare un po' di chiarezza.

Non c'è un array ma c'è una collection, che gestisci attraverso la proprietà Items della ListBox.

Il metodo Add si aspetta un testo oppure un qualsiasi oggetto che abbia definito il metodo ToString. Appena aggiungi l'oggetto cMyItem la ListBox invoca il metodo ToString e lo fa apparire a video, mentre in memoria mantiene l'oggetto cMyItem vero e proprio, dentro la collection.

Il metodo New così come lo hai riportato non è necessario, ma è utile perché riesci ad assegnare le due proprietà contestualmente alla creazione dell'oggetto. Senza quel metodo New avresti dovuto scrivere:
codice:
Dim obj As cMyItem

obj = New cMyItem
obj.MyVisibleTag = "tag visibile"
obj.MyIDTag = 1

ListBox1.Items.Add(obj)
Essendo che la proprietà SelectedItem non è tipizzata (restituisce cioè un object generico), per estrarre una qualsiasi proprietà dell'oggetto originale (nel tuo esempio cMyItem) devi fare un cast.

Se tu avessi scritto:
codice:
Me.TextBox1.Text = ListBox1.SelectedItem.MyIDTag
avresti ricevuto un errore da parte del compilatore, in quanto la classe Object non ha nessuna proprietà o metodo chiamati MyIDTag.