First of all, note that the idea I am presenting can be complex to implement. You will need to look at the signature verification routine for your selected signature schemes and modify them in a manner that doesn't break security.
Here's a generic idea for signature schemes. If you have a deterministic set of values that has to be computed to verify the signature, you can use those values as "proof" that at least part of the signature verification routine was executed. You can then mix this with the current secret using a KDF. Doing so basically ensures that every time a signature is verified in the handshake the shared secret changes unpredictably, breaking any implementation that does not compute these witness[1] values. Message recovery may be useful as well for this purpose.
Next, you can embed into the signed data for your signature an ephemeral signature public key, a chunk of random data, and two signatures. Both signatures are supposed to be signed using the corresponding ephemeral signature private key. However, one of them is valid and the other one is invalid[2]. The two ephemeral signatures are shuffled randomly each time so the implementing programmer can not assume which one is valid or invalid. You then also include as part of the full set of witness values the validity of both signatures(in order) and their corresponding witness values.
Now you have done two things:
1- Fuzzed the signature verification routine(it should accept valid signatures and reject invalid ones). This prevents someone from incorrectly implementing the verification routine and not noticing.
2- Require for each signature verification the storage of intermediate outputs in the algorithm. This means that they actually have to implement at least part of the verification routine for all the signatures involved.
Because all three signatures(2 ephemeral fuzzing signatures and the security critical one) all need to have their witness values generated to correctly update the shared secret, it becomes difficult for the programmer to avoid implementing the verification routine. Once they create the verification routine that also outputs the witness values, it becomes the path of least effort to just use it to verify the security critical signature.
There is only one last problem and that's ensuring that the implementation actually acts on the signature verification result for the security critical signature. Unfortunately, there's not much we can do for a programmer that decides to not abort upon receiving a bad signature. We have at least however forced them to implement a correct verification routine and apply it to the security critical signature.
[1] Witness because they act as proof that some part of the complete signature verification routine was computed.
[2] Look at Project Wycheproof for ideas on how to generate the invalid signature. The goal is to forcibly fuzz the verification routine for each signature sent in the protocol.