This may be too late to help, but for the benefit of later readers:
A DSA signature is expected to be the ASN.1 encoding of a SEQUENCE containing two INTEGERs. The problem here is that b_signature is actually an OCTET STRING, with the octets inside it being the correct encoding. So there is an extra "outer" wrapping around the real signature. You can see this by dumping out the structure:
Asn1OctetString outer =(Asn1OctetString)Asn1Object.FromByteArray(b_signature);
byte[] inner = outer.GetOctets();
Console.WriteLine(Asn1Dump.DumpAsString(outer));
Console.WriteLine(Asn1Dump.DumpAsString(Asn1Object.FromByteArray(inner)));
For me, this prints:
DER Octet String[71]
DER Sequence Integer(16446081942964531772961165410855935370418106604815444975891408706004345083361) Integer(87431453076334980518600256741994746667679967157867025465393185500427926877084)
So, the 'inner' octets look to be correctly encoded. Now:
bool valid = signer.VerifySignature(inner);
For me, this prints 'false', which you say is expected because the data has been modified.