Вот что вообще представляет из себя система с поддержкой плагинов:
 
Некоторая информация о интерфейсах, COM, DCOM вообще и в Delphi в частности
Попытаюсь сформулировать свои требования к инфраструктуре плагинов.
-  Любой плагин берется из пакета плагинов. 
-  Пакет плагинов находится в файле (Тоесть сам пакет может состоять и из нескольких файлов, но главный один). 
-  Сейчас пакет плагинов это просто dll с расширением spp, но должна быть возможность легко добавить новые способы хранения плагинов, например с электронной подписью dll, скриптовые или еще какие-нибудь. 
-  Файл с пакетом не блокируется без необходимости (например, пока не понадобится плагин из пакета, не вызывается LoadLibrary) в надежде что пользователь не начнет удалять файлы при работающей программе, а если и начнет, то не будет удивляться потом ошибкам. 
-  Каждый пакет идентифицируется по GUID. 
-  У каждого пакета есть номер версии, при загрузке из пакетов с одинаковым GUID выбирается с наибольшей версией. 
-  Должна быть возможность добавления кеширования информации о пакетах плагинов между сеансами работы программы. 
-  Должна быть возможность блокирования пакетов и отдельных плагинов по разным признакам, в том числе по черным и белым спискам. 
-  Каждый плагин идентифицируется по GUID. 
-  Если в нескольких пакетах есть плагины с одинаковым GUID, то используется первый загруженный. 
-  Каждый плагин принадлежит к какому-то типу плагинов. 
-  По сути тип плагина определяет публичный контракт, который плагин должен выполнять. В простейшем случае поддерживать определенный интерфейс. 
-  В программе должны легко добавляться новые типы плагинов. 
PS: Не путаем отдельные плагины и пакеты плагинов. У каждого плагина свой GUID, и у пакета в который они входят тоже есть свой уникальный GUID.
PPS: Опять же, не путаем плагины и пакеты плагинов. Информация о версии есть только у пакета плагинов. Тобишь если разработчик обновил какой-то пакет плагинов и поменял ему имя файла, то загрузится по-любому самый новый, даже если старый удалить забыли. А вот 10-й пункт это уже нарушение, но тоже можно представить ситуацию - в новой версии пакет плагинов разделили на 2 или наоборот объединили два пакета, но этого стоит избегать всеми силами.
PPPS: А сейчас объясню почему я выбрал вариант, что в dll может быть много плагинов, а не ровно 1 штука. Просто в моем понимании каждый конкретный тип плагина задает очень жесткие рамки и требования для реализующих его, но разных типов я планирую наделать очень много. Поэтому вполне может получится, что какой-то механизм сможет реализовывать 3-4 типа плагинов используя общие 90% кода. Тогда разносить их в отдельные длл получается ну уж очень нерентабельно. Да и ресурсоемко держать столько открытых dll.