The only purpose of the "IsAlive" property is for situations where you want to take some action if the target of a WeakReference has already been destroyed, but where you don't want to risk accidentally keeping it alive longer than necessary. If one were to say, e.g.
if (someWeakReference.Target == null)
cleanup_related_object();
and the garbage-collector were to (for whatever reason) trigger right after the code that evaluated someWeakReference.Target, the GC would notice that there existed a strong reference to that object and preclude its collection. On the other hand, saying:
if (!someWeakReference.IsAlive)
cleanup_related_object();
there would be no risk of accidentally prolonging the lifetime of the target of someWeakReference target