I've seen the way you are getting a path from the region, and indeed is a 'brute force' way to do it.
I just cant use this way since I need to handle floating point operations, but I can give you some hints on how to get this in a more elegant way. (Im working on this right now).
First, java.awt.geom.Area has an inmplementation of how to do logical operation to paths (It's using PathIterator to build segments and then operate them with algebraic functions). This can be implemented to .NET since it's not a very complicated algorithm.
RegionData contains information about the paths that forms a region, the problem it's not documented. I was working on this solution until now, since when a operation is applied to the region, the format seems to change.
What I have so far:
Region.GetRegionData().Data returns an array of bytes that represents that shape, this is what I have so far. (Before doing an operation to a region).
bitarray[28] has the number of paths of this region, I dont remember if I was converting it using int32, int16 o just ToString().
bitarray[36]:
First point of the path.
From now on, it's dificult to continue, since if the point is an Int it can be transformed using ToInt16 (so 2 bytes are taken) but if it's a float point 4 bytes are needed (using ToSingle).
bitarray[length - pathCount] first pathPointType.
These are easy to get, since they just need one byte per pathPointType.
Well, that's all I have, I hope to have something more this week. If someone knows something about regionData please share it.