OpenFileDialog возвращает указатель на память, содержащий последовательность строк с завершающим нулем, за которыми следует последний нуль, указывающий на конец массива.
Вот как я получаю строки C# из неуправляемого указателя, но я уверен, что должен быть более безопасный и элегантный способ.
IntPtr unmanagedPtr = // start of the array ...
int offset = 0;
while (true)
{
IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset );
string name = Marshal.PtrToStringAuto(ptr);
if(string.IsNullOrEmpty(name))
break;
// Hack! (assumes 2 bytes per string character + terminal null)
offset += name.Length * 2 + 2;
}