Thanks Jeremy!
I've actually created a plugin using the instructions in those blog posts and it works fine for getting faces. I've implemented and tweaked both the "By Direction" and the HostObjectUtils.GetSideFaces(); workflows to suit my needs. I don't think that corners count as faces though and I don't think I can use a ReferenceIntersector to hit a point in space, especially if I don't know where it is.
I imagine the corner points are really the edge where the faces join, viewed from above. I can get the outside face of a wall with the HostObjectUtils class and then iterate over the edges of it but how do I robustly get the side edges?
I have no guarantee that the wall will have two edges that go straight up and two that are perfectly horizontal so while comparing endpoints on the curves of the edges could work 90% of the time, that 10% will be trouble. If the wall has openings, that'll create more edges presumably that'll get mixed in with everything else, making it even harder to figure out which ones are the edges I need.
Is there a shortcut, like with HostObjectUtils, to get the exterior corners of a wall?