Главное правило - хеш-код не должен меняться на протяжении жизни объекта, иначе это равносильно непредсказуемому поведению всего, что основно на хешировании. И второе золотое правило - не использовать хеш для вычисления эквивалентности двух объектов, догадываешься почему?
Конкретно в моем случае - в c#, проблема еще в том, что хэш для ссылочных типов вычисляется один раз и не зависит от содержимого класса.