Flexible vertex formats are a bit outdated. By using a VertexDeclaration, you can specify exactly which data your vertex contains and how it's layed out in the struct. For more information, check
this how-to on MSDN. For you vertex, the declaration should look like this (untested!):
VertexElement[] elements = new VertexElement[]{ new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0), new VertexElement(0, 12, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0), new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0), new VertexElement(0, 28, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0), VertexElement.VertexDeclarationEnd };VertexDeclaration decl = new VertexDeclaration(device, elements);
The vertex declaration is an alternative to the VertexFormat. You no longer need to set the device.VertexFormat property if you're setting a declaration with device.VertexDeclaration. One thing to note is that the declaration is device dependent, meaning you need to call Dispose() on it when the device is lost and recreate it when the device is reset.
Hope this helps :)