почему первые два возвращают System.Object и как это можно исправить?
Потому-что dynamic под капотом - это на самом деле Object и куча рефлексии.
List<dynamic>
- это на самом деле
List<object>
(можешь загнать в sharplab и убедиться в этом)
Исправить это можешь только отказавшись от dynamic (а лучше вообще забыть о его существовании. Крайне сломанная фича, которая путём говнокода позволяет в некоторых случаях сэкономить строчки)
Например, если нельзя трогать ClientViewModelNew и ClientViewModelOld, то можно попробовать так:
public interface IClientViewModel {
public string EXa { get; set; }
}
public class ClientViewModelNewWrapper: IClientViewModel {
private readonly ClientViewModelNew _internal;
public ClientViewModelNewWrapper(ClientViewModelNew obj) => _internal = obj;
public string EXa { get => _internal.EXa; set => _internal.EXa = value;}
}
public class ClientViewModelOldWrapper: IClientViewModel {
private readonly ClientViewModelOld _internal;
public ClientViewModelNewWrapper(ClientViewModelOld obj) => _internal = obj;
public string EXa { get => _internal.EXa; set => _internal.EXa = value;}
}