Short answer: Dictionary can't detect that some hashcode changed. There is no event that it can subscribe to. Getting hashcode is just a call to Object.GetHashCode(). That method is called once when you insert the object. For obvious performance reasons Dictionary can't call that method for all the objects in a collection every time you perform some operation on Dictionary.
Why doesn't the Dictionary class have logic to move an object to the correct bucket when it detects that the object's hashcode has changed?
Because that defeats the object of a dictionary. The whole of a dictionary is to have an immutable set of keys. Since the key is immutable, its hash value won't change. If your hash values are changing, then that means your keys aren't immutable and a dictionary isn't the right type for you. Take a look at the KeyedCollection<TKey, TItem> class, which is an abstract collection class that lets you override some of the dictionary behaviours under the hood to create hash tables with mutable keys for example. It's obviously slower, but may well suit your needs.