Ich nehme mal an, du benutzt WinForms?
Wenn du die Tag Eigenschaft nicht verwenden möchtest, kämen z.B. noch folgende Sachen infrage:
1. Eine Verbindungsklasse, die bspw. aus der Datenstruktur ein TreeView bevölkert und dabei ein Dictonary<TreeNode,DataClass> befüllt. Damit kannst du sofort* zu einem TreeNode das passende Datenobjekt finden. Diese Zwischenschicht kann sich dann an die Delegates der TreeNodes hängen und das passende Datenobjekt verändern oder benachrichtigen.
2. Du benutzt DataBinding. Im Grunde wie 1. aber mit weniger programmieren und mehr nachgucken und rumprobieren wie man ein Treeview mit Databinding befüllt und auf Änderungen reagiert. Wahrscheinlich weniger Codeintensiv und übersichtlicher. Wenn der Funktionsumfang ausreicht, ist dies die empfohlene Variante
3. Du benutzt WPF.
Das wären erstmal meine Ideen...
* = Laufzeit O(1)