This turned out to be pretty simple.
In my macro method...
return new TreeNodeCollection("custom.pagetype", tree.SelectNodes().Where(...).Execute());
TreeNodeCollection is an extension of ObjectCollection, which is also extended by InfoObjectCollection, but I've not experimented with that yet.
Since the query can be modified with Columns(), Where(), etc methods after being provided through the macro, I'm curious how to avoid calling Execute(), for efficiency's sake.