Я бы делал так (ИМХО):
1. Есть базовый класс (для ANSI).
2. Есть список форматов, генерирующийся на основе содержимого папки с программой.
3. В папке содержатся файлы (например, с расширением .enc), являющиеся DLL.
Функции, предоставляемые DLL:
PHP код:
procedure GetInfo(var EncodingClass: integer; var Name: string; var Descr: string; var Author: string);
// Информация о модуле:
// * класс (зарезервировано на случай, если модули будут использоваться в разных программах пакета),
// * название (в данном случае - кодировка),
// * описание (любой текст от разработчика),
// * автор.
function IsFileInEnc(FileName: string): boolean;
// Проверяет файл на возможность загрузки при помощи данного модуля
function IsStringInEnc(S: String): boolean;
// То же самое для строки
function FileToAnsi(FileName: string): string;
// Преобразует файл из кодировки модуля в ANSI
function StringToAnsi(S: string): string;
// То же самое для строки
function AnsiToString(S: String): string;
// Преобразует строку из ANSI в кодировку модуля.
procedure AnsiToFile(S: String; FileName: string);
// Преобразует строку из ANSI в кодировку модуля и сохраняет в файл.
Можно ещё добавить функционал для работы со Stream-данными, но не существенно.
При вызове функции загрузки/сохраниния/перекодирования, пробегаемся по списку и проверяем...