As @Stephen and @andrepena has said, the issue is that Distinct is taking object reference equality and thus concluding that all the entries are distinct.
One solution is to define a different Equality model by implementing IEquality, as above, but that makes the assumption that it is sensible to define Equality between these ViewModels as being identically equivalent to their ID's equality. Not just in this query but everywhere!
If that is the case, then defining IEquality is exactly what you should do - it will solve this problem every time you use the class for this sort of thing.
But if that's not the case, or you don't want to use IEquatable, then another option is to make the Distinct-ness filter look at the Id directly. This can't be done with vanilla Linq, but the ever-invaluable MoreLinq package has Distinctby built into it:
var myEnumerableOfObjectsWithIds;
var output = myEnumerableOfObjectsWithIds.DistinctBy(obj => obj.Id)
output
will hold the set of objects that are distinct when considering the appropriate Equality on the IDs. If they are value-types, then it will use basic value equality, if they are ID objects it will use reference type equality (unless you've implement IEquatable ... and thus we fall into a loop :) )