I don't like the overhead of
IEnumerable<OrderedDictionary>
You are repeating the column names for every row.
There is no check for count not matching in row versus header.
Consider
IEnumerable<IEnumerable<string>>
Or
IEnumerable<string[]>
Somehow report if line does not match header
Split accepts char[]
Might as well support that