Вот так выглядит File.OpenRead:
public static FileStream OpenRead(string path)
{
return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}
А так конструктор с двумя параметрами для FileStream:
internal const FileShare DefaultShare = FileShare.Read;
public FileStream(string path, FileMode mode)
: this(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, DefaultShare, DefaultBufferSize, DefaultIsAsync) {}
Собственно главная разница в переданном FileAccess. В случае OpenRead файл открывается только для чтения, а в случае FileStream и на чтение и на запись. Переданный FileShare позволяет только читать файл из нескольких мест, и при открытии с FileAccess.ReadWrite как раз получается ваша проблема (т.к. оно хочет ещё и писать в файл).