Firstly, I raised your question, because it really causes a rare scenario - it was also not easy to answer, judging by how many people transmit it ... Which also means that you will need to do some reading :). ..
Short answer: xsd.exe creates useful code; perhaps this is not how you expected, and I will explain why, but it works (at least with my tests); if you have no problem exchanging this XML, and not just with it, how it is created. If not, then Linq will work for sure.
So, the main problem starts with how the XML schema was created; given that it comes from I was surprised to see this (perceived) ambiguity in the authorship style, which is ultimately also responsible for why xsd.exe does not seem to give the expected result.
Please start by reading this article with a focus on the Abstract Attribute and SubstitutionGroup Attributes.
Usually the leader of a substitution group should be an abstract element. Although this does not meet the specification, I suspect that many people make this assumption in their tool (xsd.exe is one), as otherwise there is a risk of ambiguity with the @xsi: type type.
In the BPMN scheme, the leader of the replacement groups is not abstract (the one I was looking at); Moreover, the elements used as the head of the substitution group have an abstract type - these are rings in xsi: type. In short, if you look at the generated code, xsd.exe creates the right code, choosing between using or not using xsi: type; he went with the first.
This code refers to the generated xsd.exe code to create simple XML.
BPMNEdge edge = new BPMNEdge(); edge.id = "B2"; // more code here for waypoint plane.DiagramElement1 = new DiagramElement[] { edge };
The DiagramElement1 property will basically accept any type that is inferred from the DiagramElement type, basically populating the contract (and providing you with the @xsi: type for DiagramElement in the generated XML).
Assume XML below; I could not understand if the DiagramElement essay would help solve your problem ... I don’t think it could be that simple, but I will leave it to you.
<?xml version="1.0" encoding="utf-16"?> <BPMNPlane xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="A1" xmlns:q1="urn:tempuri-org:alpha" bpmnElement="q1:test" xmlns="http://www.omg.org/spec/BPMN/20100524/DI"> <DiagramElement xmlns:q2="http://www.omg.org/spec/BPMN/20100524/DI" xsi:type="q2:BPMNEdge" id="B2" xmlns="http://www.omg.org/spec/DD/20100524/DI"> <waypoint x="1" y="1" /> <waypoint x="1" y="1" /> </DiagramElement> </BPMNPlane>
The (also valid) XML below was generated by a tool (not the code generated by xsd.exe); it shows a perfectly valid alternative to the above XML, using the members of the replacement group that you wanted. All you have to do is figure out what else is in place of the DiagramElement. I used this graph to view it:

<?xml version="1.0" encoding="utf-16"?> <BPMNPlane xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="A1" xmlns:q1="urn:tempuri-org:alpha" bpmnElement="q1:test" xmlns="http://www.omg.org/spec/BPMN/20100524/DI"> <BPMNEdge xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" p4:any_Attr="anySimpleType" bpmnElement="qname1" sourceElement="qname1" targetElement="qname1" messageVisibleKind="initiating" id="ID1" xmlns:p4="otherNS" xmlns="http://www.omg.org/spec/BPMN/20100524/DI"> <di:extension/> <di:waypoint x="1" y="1"/> <di:waypoint x="-1.7976931348623157E+308" y="-1.7976931348623157E+308"/> <BPMNLabel p4:any_Attr="anySimpleType" labelStyle="qname1" id="ID2"> <di:extension/> <dc:Bounds x="1" y="1" width="1" height="1"/> </BPMNLabel> </BPMNEdge> </BPMNPlane>
I think this scheme is a great example that shows how one could use both methods (with or without xsi: type authoring style) using only one scheme. A great test may be to see if this last XML can be deserialized using the code generated by xsd.exe, and what changes will need to be made to make it work.