However, I now have a large number of simple functions for reading and writing XML that have the advantage of centralizing the read/write functionality so that it always works in the same way; a number of classes that know how to read and write their XML representations so that they can be sent across the wire from the C# to the C++ side of the world and vice versa; and a control derived from the C# ErrorProvider that provides accessible error handling if the user requests it in user preferences. (The preference isn't coded yet, but the hook is there. Someone else is working on the preferences at the moment.)
I have spent the last couple of days making sure that the XML is correctly aligned everywhere so that member values are written as member values, attribute values are written as attribute values, and optional members are treated as optional instead of throwing an exception. I am now very close to getting this all to work.