Так а в чем проблема то, непонятно как делать? Нужно значит почитать про DLL библиотеки и все сразу станет ясно. Создание окна через DLL ничем не отличается от создания окна, непосредствено, в экзешнике. Отличается только способ вызова ф-ций. 
 В кратце, при создании DLL в дополнении создается и .lib файл, который используется для связывания ф-ций, находящихся в DLL, с твоим приложением. Обычно кроме этого существует еще и хедер (.h) с объявлением экспортируемых (а на другой стороне - импортируемых) ф-ций. 
 Например есть некий Header.h, в нем такой код: 
 Code
 
 #define ENGINE_API __stdcall 
 #define ENGINE_EXPORT extern "C" __declspec(dllexport) 
 #define ENGINE_IMPORT extern "C" __declspec(dllimport) 
 #ifdef ENGINE_HEADER_ONLY  //Обявляется в приложении 
 ENGINE_IMPORT bool ENGINE_API Intialize (int Width, int Height); 
 #else 
 ENGINE_EXPORT bool ENGINE_API Intialize (int Width, int Height); 
 #endif 
 
 По умолчанию если заинклудить данный хедер, то будет объявлена ф-ция Initialize в качестве эскпортируемой из движка (и использовать ее можно только в DLL движка ). В приложении перед инклудом данного хедера объявляется директива ENGINE_HEADER_ONLY и в результате ф-ция объявится как импортируемая (из DLL), а чтобы оно нашло реализацию этой ф-ции - нужно прилинковать одноименный .lib файл. И можно будет легко звать эту ф-цию из DLLки. 
 В самом движке она реализуется обычно (например какой-нить Core.cpp): 
 Code
 
 #include "Header.h" 
 bool ENGINE_API Intialize (int Width, int Height) { 
 //тут обычный код, который создает окно. И з приложение эта ф-ция легко дергается. 
 }