O BouncyCastle.Cryptography (o pacote que substituiu o Portable.BouncyCastle) é código gerenciado puro: seus resultados não dependem do CNG do Windows nem da versão do OpenSSL no Linux, e é exatamente isso que o torna útil ao lado do System.Security.Cryptography. Ele oferece uma API SignerUtilities baseada em strings e classes de nível mais baixo, como ECDsaSigner.
Os padrões de ECDSA seguem a tradição do OpenSSL, e não a do .NET: SHA-256withECDSA produz DER, enquanto SHA-256withPLAIN-ECDSA gera o r‖s bruto de 64 bytes que o próprio ECDsa do .NET e o JWS usam. Confundir os dois é a falha de interoperabilidade mais comum entre as duas bibliotecas em uma mesma aplicação, e toda entrada malformada retorna false em vez de lançar uma exceção. Os nonces são aleatórios pelo SignerUtilities; ECDsaSigner com um HMacDsaKCalculator reproduziu o vetor de teste da RFC 6979. O s não é normalizado e a verificação aceita high-S.
A cobertura é o motivo pelo qual as pessoas o adicionam: da P-224 à P-521, secp256k1 e as curvas Brainpool r1; Ed25519 e Ed448, como no exemplo; e ML-KEM, ML-DSA e SLH-DSA por meio de MLKemEncapsulator, MLDsaSigner e SlhDsaSigner — tudo isso funcionou na mesma imagem Linux em que a biblioteca de classes base não indicou nenhum suporte pós-quântico. Experimente os algoritmos no playground de assinaturas pós-quânticas.
PemWriter grava chaves privadas EC como SEC1 -----BEGIN EC PRIVATE KEY-----, e PemReader as retorna como um AsymmetricCipherKeyPair; o PKCS#8 passa por PrivateKeyInfoFactory. A versão do próprio assembly é a de nome forte 2.0.0 em todas as versões 2.x, então confira a versão do pacote (aqui, 2.7.0) ao comparar comportamentos.