Программная работа с ЭЦП
Рекомендую первично ознакомиться с понятием Crypto API и для начала почитать мою давнюю статью Использование Crypto API. Также рекомендую почитать форум фирмы Крипто-ПРО. Различных примеров там приводится множество.
К сожалению, C# не знаю, могу поделиться своей функцией на IronPython. Порядок действий, классы и методы будут одинаковые.

from System.Security.Cryptography import Pkcs
from System.Security.Cryptography.X509Certificates import X509Store, OpenFlags, X509Certificate2Collection,\
    X509Certificate2, X509Certificate2UI, StoreName

def sign(content, tp):
    store = X509Store(StoreName.My)
    store.Open(OpenFlags.ReadOnly)
    storecollection = X509Certificate2Collection(store.Certificates)
    myCert = None
    for cert in storecollection:
        if cert.Thumbprint.ToLower == tp.ToLower:
            myCert = cert
    if not myCert:
        return None
    else:
        contentInfo = Pkcs.ContentInfo(content)
        signedCms = Pkcs.SignedCms(contentInfo, True)
        cmsSigner = Pkcs.CmsSigner(myCert)
        signedCms.ComputeSignature(cmsSigner)
        sign = signedCms.Encode()
        return sign

Соответственно, тут на входе байты файла и строка с отпечатком (Tumbprint, его можно посмотреть в свойствах сертификата, но если захотите скопировать прямо от туда, то нужно убрать пробелы)
Вместо передачи отпечатка можно прямо просить выбрать сертификат. У класса X509Certificate2UI есть метод SelectFromCollection, который показывает стандартное окошко выбора сертификата и возвращает коллекцию с выбранными сертификатами.
Касательно того, что это криптопровайдер от КриптоПро — в общем-то, в данном случае не имеет значения.

Ну, соответственно, остаётся прочитать файл и сохранить байты подписи в имя_файла.sig