codice:
CFactory1Impl* CFactory1Impl::instance_ptr;
/* tra qui */

/* e qui */

CEntityDS* CFactory1Impl::CreateDS( int idOfObjectToCreate ) {
	
	BASE_CREATE_FN fz = m_pMapRegister[0] = CBeamDSChess::instance;
		return fz();
   return 0; 
}
Nelle righe "tra qui" "e qui" devi mettere la definizione della classe CBeamDSChess o delle sue derivate, altrimenti il compilatore non può sapere com'è fatta la classe solo dalla sua forward declaration, e quindi non può sapere se esiste un metodo instance o no per quella classe.
Se tu inserisci l'header che hai detto (BeamDsChess.h), il compilatore sa com'è fatta la tua classe per essere istanziata nella DLL per cui il problema è risolto.

Ne nasce un altro però: quando crei la DLL hai codice fatto e finito, pertanto se non stai attento può capitarti di allocare da un lato (esempio nella DLL) e deallocare dall'altro ( esempio nell'applicazione). Dal momento che gli allocatori sono diversi da debug a release è probabile che l'applicazione vada in crash.
La regola è: se allochi nella DLL, devi deallocare nella DLL (ragion per cui ho aggiunto il metodo release() nel mio stralcio di codice). COM, Xerces e non solo, adottano questo sistema.

Se riguardi il mio stralcio di codice d'esempio, io non uso:
codice:
CBeamDSChess::instance;
ma
codice:
CBeamDSChess_type1::instance;
dove CBeamDSChess_type1 è derivata dall'interfaccia CBeamDSChess che avrà solo metodi virtuali puri (no costruttore o distruttore).
L'applicazione conoscerà solo le classi interfaccia + la funzione di caricamento della factory; la DLL deve conoscere le interfacce astratte, le implementazioni concrete e ovviamente il codice delle funzioni da eseguire.

Se segui le linee guida del link che ho postato, puoi tranquillamente creare un DLL full release in VC2008 e usarla in VC2010 (o viceversa) senza cambiare una singola linea di codice.