Я со временем разобрался с ответом на это сам. Я обнаружил в System.Xml.LINQ класс с именем XStreamingElement, который может создавать структуру XML на лету из выражения LINQ. Вот пример преобразования DataTable в XML-пространство.
Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
from t in Tables
select new XStreamingElement(t.Key,
from DataRow r in t.Value.Rows
select new XStreamingElement("row",
from DataColumn c in t.Value.Columns
select new XElement(c.ColumnName, r[c])))))
В результате получается XElement (TableRoot) со структурой, подобной следующей, при условии, что словарь содержит одну таблицу под названием «Orders» с двумя строками.
<Tables>
<Orders>
<row>
<sku>12345</sku>
<quantity>2</quantity>
<price>5.95</price>
</row>
<row>
<sku>54321</sku>
<quantity>3</quantity>
<price>2.95</price>
</row>
</Orders>
</Tables>
Это можно объединить с большей иерархией на основе XElement / XDocument и запросить с помощью XPath.