Причина проблемы в том, что анонимные типы являются внутренними для сборок. Вот почему Dynamic Language Runtime не позволяет вам обращаться к свойствам из другой сборки.
В этом посте разъясняется одно решение. В сборку можно добавить пользовательский атрибут, определяющий анонимный тип, позволяющий другой сборке получить доступ к своим внутренним компонентам.
Другое решение - вернуть объект открытого класса (с открытыми свойствами). Это, конечно, убьет преимущества анонимного типа.
Третье решение будет использовать ExpandoObject , как предложено Рид Копси .
Если вы все еще хотите использовать анонимный тип, вы можете написать динамический класс, который «украшает» любой анонимный тип и предоставляет его члены. Такой класс должен был бы реализовать интерфейс IDynamicMetaObjectProvider и получить доступ к декорированному объекту через отражение. Возможно, этот материал уже был кем-то реализован.