Технически, да, компилятор может сделать это, но в идеале он не будет .
Причина в том, что у вас возникнут проблемы с определением, есть ли что-либо еще, удерживающее ссылку. Компилятор не может определить, кто хранит ссылку во время компиляции (возможно, с помощью статического анализа, но это не гарантировано).
Теперь, это может быть возможно сделать во время выполнения, но это все еще не идеально. Требуется эквивалент GC каждый раз, когда для ссылки задано значение NULL (метка и развертка). Затем для всего, что является GCed, если есть реализация IDisposable, вызовите Dispose. Это затянет CLR в грязь и заставит его работать ужасно.
Конечно, всегда есть подсчет ссылок (как упомянул nonnb в своем комментарии к вопросу), но это просто возвращение к COM, и тоже не идеально. Сложности подсчета ссылок - это то, что породило аспект GC CLR.
Что следует учесть: если у вас есть ситуация, когда вы не знаете, кто на самом деле владеет вашей реализацией IDisposable, тогда это представляет собой недостаток дизайна в вашей системе. Если у вас есть функция, которая работает с такими экземплярами, она должна либо сделать явное заявление о том, что она будет распоряжаться такими экземплярами, либо оставить это на усмотрение вызывающей стороны (последний является предпочтительным методом).