Erg, ok, I must be missing something here - what's the problem with doing the tree
at all?

You can determine the type of data by the icon, you could even have multiple icons that are identical if you didn't feel like making more than a couple.
Then you know what to do with the pointer, what dialog to display when it's clicked. Handling the select message shouldn't be much worse than handling the one from a bunch of tabs.
To display the stuff, all you need is one update function - unless you don't want it to reset every time something is added. In that case you'd need an add function that would take the pointer to the new type, the parent item's pointer, and then the icon to show for it. Then you run through the tree, looking for an item with the same pointer as the parent, and add the item that's being added as its child.
A delete function is also easy, figure out what item's selected, try to delete the item using a standardized delete() function, and then call wxTreeCtrl:: Delete().
It's somewhat confusing/complex but not "nightmarish".