var mData = new Dictionary<string, List<string>>
{
{ "X", new List<string>() { "あ", "い", "う" } },
{ "Y", new List<string>() { "か", "き", "く" } },
{ "Z", new List<string>() { "さ", "し", "す" } }
};
var sData = new Dictionary<string, List<string>>
{
{ "X", new List<string>(){ "あ", "あ", "あ", "い", "う", "う" } },
{ "i", new List<string>(){ "subI1", "subI2", "subI3", "subI1", "subI1", "subI2" } },
{ "j", new List<string>(){ "subJ1", "subJ2", "subJ3", "subJ1", "subJ1", "subJ2" } }
};
var key = "X";
var mDataValueSize = mData.Max(kv => kv.Value.Count); // valueのlistの要素数は全て同一と仮定
var mSeq = Enumerable.Range(0, mainDataValueSize); // 第一引数は開始位置, 第二引数は個数で連続する配列
foreach (var m in mSeq) {
var keyValue = mData[key].ElementAt(m);
var sIndex = sData[key].IndexOf(keyValue);
var seq = sData[key].Where(kv => kv == linkingKeyValue).Count();
var subSeq = Enumerable.Range(sIndex, seq);
foreach (var s in subSeq) {
var oneRec = sData.ToDictionary(kv => kv.Key, kv => kv.Value.ElementAt(s));
}
}