Να αποσαφηνίσουμε και κάτι ακόμα... Ο JIT Compiler δεν έχει καμία σχέση με την όλη ιστορία. Δουλειά του είναι να μετατρέπει τον MSIL κώδικα σε machine κώδικα και αυτό συμβαίνει την πρώτη φορά που τρέχει ένα assembly καθώς και σε κάποιες άλλες ειδικές περιπτώσεις. Ό,τι κουβεντιάζουμε εδώ (Garbage Collection, κλπ), είναι καθαρά functionality του CLR. Έτσι λοιπόν, το "Cannot access a disposed object." δεν είναι μήνυμα που βγάζει ο JIT Compiler. Όταν εμφανιστεί αυτό το μήνυμα, έχει ήδη τρέξει και έχει τελειώσει ο JIT Compiler.
Τέλος κάτι άλλο: Μην συγχέεις γενικά τη συμπεριφορά όλων των objects στο θέμα του dispose με το πως συμπεριφέρονται οι φόρμες. Οι φόρμες είναι μεν objects που προέρχονται από κλάσεις αλλά έχουν implemented λογική στο Dispose function. Αυτή η λογική βρίσκεται στη base κλάση System.Windows.Forms.Form, οπότε βρίσκεται σε όλες τις φόρμες που κατασκευάζεις.
Η λογική της Dispose των φορμών είναι ότι άπαξ και γίνουν dispose δεν πρέπει να ξαναχρησιμοποιηθούν, δηλαδή από τη στιγμή που έχουν καθαριστεί τα unmanaged resources δεν έχει νόημα να ξαναχρησιμοποιηθούν παρά μόνο αν φτιαχτεί νέο instance τους. Αν για παράδειγμα, έχεις ανοίξει ένα log file και γράφεις μέσα πράγματα και το κλείσεις με τη Dispose, θα πρέπει να φτιάξεις νέο instance για να ξαναδημιουργηθεί αυτό το log file.
Έτσι λοιπόν, μιας και δεν μπορεί η φόρμα εκ των πραγμάτων να φύγει από τη μνήμη (μιας και αυτό θα το κάνει ο GC) κρατάει το αν έχει γίνει Dispose εσωτερικά σε ένα boolean member που λέγεται Disposed και εμφανίζει exception αν πας να τις χρησιμοποιήσεις "παράνομα".
Άρα λοιπόν, αν θέλεις να ελέγξεις αν μπορείς να χρησιμοποιήσεις μια φόρμα, θα πρέπει να πεις
If someForm Is Nothing OrElse someForm.IsDisposed Then...
Αρχικά δηλαδή ελέγχεις αν υπάρχει το instance και κατόπιν αν δεν είναι Disposed. To IsDisposed πάλι είναι ένα property που δεν το βρίσκεις πάντοτε σε όλες τις κλάσεις παρά μόνο αν το έχει φτιάξει ο κατασκευαστής τους.
Για να κλείσουμε, όταν ανοίγεις μια φόρμα με τη μέθοδο Show, και κατόπιν την κλείνεις με τη Close ή πατώντας το "X" τότε η φόρμα γίνεται αυτόματα Disposed ενώ όταν την ανοίγεις με ShowDialog όχι και γι αυτό στη δεύτερη περίπτωση είναι δική σου ευθύνη να καλέσεις τη Dispose.
Άρα λοιπόν, το θέμα δεν είναι τι περιμένεις εσύ (από φιλοσοφικής άποψης) ότι πρέπει ή δεν πρέπει να γίνεται στο managed περιβάλλον, αλλά το τι συμβαίνει στη πραγματικότητα από αυτούς που έχουν φτιάξει τη κλάση System.Windows.Forms.Form
Vir prudens non contra ventum mingit