Ну, во-первых, можно легко снимать скриншоты обычным принтскрином, если игра запущена в оконном режиме, будь она хоть трижды на DirectX и OpenGL. Так проще, тем более, что многие современные игры это умеют.
Во-вторых, по делу: мы имеем ДЛЛ в другом процессе, т.е. требуется IPC (Interprocess Communication). Тут могут быть разные варианты, большинство из которых строятся на костылях.
Вариант первый, наверно самый простой - создать в игре фейковое пустое невидимое окно и слать сообщения этому окну. В dll сделать обработчик сообщений окна.
Вариант второй, тоже кривой - поднять в dll серверный сокет на localhost и принимать команды.
Вариант третий - использовать пайпы (Pipes).
Вариант четвертый, наркоманский - создать объект для синхронизации каким-нибудь CreateEvent, сбросить его состояние в DLL и сделать WaitForSingleObject. Когда надо сделать скрин из своего приложения менять состояние объекта. В этот момент поток выйдет из ожидания, сделает скриншот и снова сбросит состояние объекта.
Вообще, на MSDN есть
список предлагаемых вариантов, но большинство из них трудноприменимы.