What you are looking for here I believe is the call to the Marshaller to manually marshal from unmanaged to managed memory:
String myStr;
fixed (byte* pImageName = outBuffer)
{
var convertedArray = new byte[outLength];
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(pImageName), convertedArray , 0, outLength);
myStr = System.Text.Encoding.UTF8.GetString(convertedArray);
}
The key to the above code is the call to the marshal copy, which moves the bytes from unmanaged to managed memory. You will want to make sure that the unmanaged memory is available and is of the appropriate length or you can get some very unexpected results.
Note
As others have said, most of the time you want to avoid pointers when possible. If you are importing a C++ or other unmanaged library, most of the time you can just use the "IntPtr" type and allow .NET to do the conversions for you. StringBuilder will typically map to a C++ char pointer as well - again, hopefully you won't need to use pointers. At its core, though, my understanding is that the interop services uses the marshal calls internally so if necessary, look through this interface and I think you should find what you are looking for.
Good luck!