BouncyCastle.Cryptography (the package that replaced Portable.BouncyCastle) is pure managed code: its results do not depend on Windows CNG or the Linux OpenSSL version, which is exactly what makes it useful next to System.Security.Cryptography. It offers a string-based SignerUtilities API and lower-level classes such as ECDsaSigner.
Its ECDSA defaults follow the OpenSSL tradition rather than .NET's: SHA-256withECDSA produces DER, while SHA-256withPLAIN-ECDSA gives the 64-byte raw r‖s that .NET's own ECDsa and JWS use. Mixing them up is the usual interop failure between the two libraries in one application, and every malformed input returns false rather than throwing. Nonces are random through SignerUtilities; ECDsaSigner with an HMacDsaKCalculator reproduced RFC 6979's test vector. s is not normalized and verification accepts high-S.
Coverage is what people add it for: P-224 to P-521, secp256k1 and the Brainpool r1 curves; Ed25519 and Ed448, as in the sample; and ML-KEM, ML-DSA and SLH-DSA through MLKemEncapsulator, MLDsaSigner and SlhDsaSigner — all of which worked on the same Linux image where the base class library reported no post-quantum support at all. Try the algorithms in the post-quantum signature playground.
PemWriter writes EC private keys as SEC1 -----BEGIN EC PRIVATE KEY----- and PemReader returns them as an AsymmetricCipherKeyPair; PKCS#8 goes through PrivateKeyInfoFactory. The assembly's own version is the strong-name 2.0.0 for every 2.x release, so check the package version (here 2.7.0) when comparing behaviour.