I finally found the solution. The OutBuffer needs to be the pointer to the 1st element of the array, not the pointer to the array.
The marshaling did not even require anything beyond [StructLayout(LayoutKind.Sequential)] for LKIF_FLOATVALUE to process the array of structure correctly.
[StructLayout(LayoutKind.Sequential)]
public struct LKIF_FLOATVALUE
{
public LKIF_FLOATRESULT FloatResult;
public float Value;
}
[DllImport("LkIF2.dll")]
public static extern RC LKIF2_DataStorageGetData(int OutNo, int NumOfBuffer, ref LKIF_FLOATVALUE OutBuffer, ref int NumReceived); // Works perfectly
RC ReturnCode = LKIF2_DataStorageGetData(OutNo, NumOfBuffer, ref OutBuffer[0], ref NumRecieved);