Юрий, спасибо за заданное направление!
К сожалению, через CryptQueryObject так и не смог получить контекст сертификата. Обстоятельства таковы, что приходится вызывать CriptoAPI на C# через p/invoke, примеров найти не смог, для меня эта тема мало знакомая :(
Зато получить, начитавшись интернетов, через CertCreateCertificateContext вот так:
            byte[] certData = GetFileBytes(CertificateFile);
            IntPtr pRecipient = Crypto.CertCreateCertificateContext(Crypto.X509_ASN_ENCODING | Crypto.PKCS_7_ASN_ENCODING, certData, certData.Length);
В pRecipient получаю контекст и даже могу на его основе создать объект X509Certificate2 и с ним поработать
X509Certificate2 pCert = new X509Certificate2(pRecipient);
result = result + "pCert.GetFormat(): " + pCert.GetFormat() + "\n";
result = result + "pCert.GetCertHashString(): " + pCert.GetCertHashString() + "\n";
Но когда доходит до вызова CryptEncryptMessage, то из неё возвращается false, при этом GetLastError() возвращает 0, и я не могу в результате понять, что конкретно ей не нравится. При этом если вызвать CryptEncryptMessage с заведомо кривыми агрументами, например массив rgpRecipientCert содержит 1 элемент, а в cRecipientCert передать 2, то валится вполне себе AV, который перехватывается отладчиком. А в моём же случае просто тишина. Крипто-Про куда то пишет лог? В виндовых журналах ничего похожего не нашёл, в директории, куда установлена CSP одни бинарники, в C:\Users тоже ничего похожего не нашёл. Попробовал в DebugView посмотреть, тишина. Может быть логирование надо как-то включить, но как?
Юрий, и ещё котел бы уточнить, описанный мой способ похож на то, что вы описали как менее элегантный?
Автор: Юрий 
Менее элегантный - загружать контекст файла в память и декодировать ASN.1 структуры непосредственно через CryptDecodeObject.
 Если да, то можете уточнить, что конкретно мне нужно декодировать? Ведь это же и может быть причиной моей ошибки?
Заранее спасибо!