ArrayMesh works (in my limited experience) -- my current workflow is basically
(pseudo C#)
ArrayMesh m = new ArrayMesh()
//for each surface + material we want ...
m.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, data)
int surfaceIndex = m.GetSurfaceCount() - 1
m.SurfaceSetMaterial(surfaceIndex, material)
///next surface