It has been a long time since I've done any directx or opengl, so take my advice with a grain of salt, but I remember doing something like this a while ago.
I think I did something like this:
var graphicsStream = new GraphicsStream();
var elements = graphicsStream.Create(Usage.Position);
graphicsStream.Create(Usage.Color);
graphicsStream.Create(Usage.Fribble);
elements.SetData(new[] { new Vector3(), new Vector3() });
var vertexFormat = graphicsStream.GetFormat();
graphicsStream.Validate(); // ensure all the streams have the same length
// get a particular element by type
var p = graphicsStream.GetData(Usage.Position, 1);
You'd have a graphics stream which was a set of typed data sets with a usage applied. From this you can generate an appropriate vertex format. The API would let you change individual elements or upload and replace the entire vertex buffer in one go.
The biggest downside is that you don't have one structure that represents a "column" in your vertex structure.
I don't know if this is the kind of thing you're looking for. Why would a design like this not be appropriate?