Сам код выглядит достаточно костыльно.
Использовать
new для переопределения свойств методов, стоит если это __действительно__ очень надо и никак-никак по-другому сделать нельзя.
Насколько я понимаю,
PriceVm наследуется от
PriceDto
Тогда, например, можно сделать вот так:
public abstract class ProductDtoBase<T> where T : PriceDto
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<T> Prices { get; set; }
}
public class ProductDto : ProductDtoBase<PriceDto>
{
}
public class ProductVm : ProductDtoBase<PriceVm>
{
}