Alla fine me la sono creata da solo una classe per copiare la directory, l'ho testata e va abbastanza bene, su può compilare per creare una DLL.
E' una classe statica con un solo metodo pubblico statico che è Copy, prende la cartella di origine e destinazione, se una delle due non esiste caccia errore, cmq vedete voi.
Ho tentato, nel caso di creazione di nuova cartella (quando esegue la copia) di settare nella cartella creata gli stessi attributi di quella di origine, ma per ora non funziona.
Usufruite 
codice:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace DirectoryDX
{
public static class DirectoryDX
{
public static void Copy(String Source, String Destination)
{
try
{
Destination = Destination.Replace('/', '\\');
Source = Source.Replace('/', '\\');
if (!Directory.Exists(Source))
throw new IOException("Cartella sorgente inesistente");
if (!Directory.Exists(Destination))
throw new IOException("Cartella di destinazione inesistente");
if (Destination.Substring(Destination.Length - 1).Equals(@"\"))
Destination = Destination.Substring(0, Destination.Length - 1);
if (Source.Substring(Source.Length - 1).Equals(@"\"))
Source = Source.Substring(0, Source.Length - 1);
if (DirectoryDX.VerificaRicorsione(Source, Destination))
DirectoryDX.Copia(Source, Destination);
}
catch
{
throw;
}
}
private static Boolean VerificaRicorsione(String Sorgente, String Destinazione)
{
try
{
String temp;
if (Sorgente.ToLower().Equals(Destinazione.ToLower()))
throw new IOException("Non puoi copiare una cartella dentro se stessa. Non avrebbe senso.");
temp = Destinazione;
while (temp.ToLower().Length<=3)
{
temp = Directory.GetParent(temp).ToString();
if(temp.ToLower().Equals(Sorgente.ToLower()))
throw new IOException("Non puoi copiare una cartella dentro una cartella contenuta in essa. Si creerebbe una ridondanza.");
}
return true;
}
catch
{
throw;
}
}
private static void Copia(String Sorgente, String Destinazione)
{
try
{
String Attuale;
String[] cartelle = Directory.GetDirectories(Sorgente);
String[] files;
for (int i = 0; i <= cartelle.GetUpperBound(0); i++)
{
Attuale = Destinazione + cartelle[i].Substring(cartelle[i].LastIndexOf('\\'));
if (!Directory.Exists(Destinazione + cartelle[i].Substring(cartelle[i].LastIndexOf('\\'))))
{
Directory.CreateDirectory(Attuale);
Directory.SetAccessControl(Attuale, Directory.GetAccessControl(Sorgente));
}
Copia(cartelle[i], Destinazione + cartelle[i].Substring(cartelle[i].LastIndexOf('\\')));
}
files = Directory.GetFiles(Sorgente);
for (int i = 0; i <= files.GetUpperBound(0); i++)
{
File.Copy(files[i], Destinazione + files[i].Substring(files[i].LastIndexOf('\\')));
}
}
catch
{
throw;
}
}
}
}