Ну, вроде бы так и есть.
IList<double> nSMFI = ctx.GetData("SMFI",
new[] { SMFIPeriod.ToString() },
delegate { return mfi.Execute(source); });
IList<double> nSDiv = ctx.GetData("SDiv",
new[] { SDivPct.ToString() },
delegate { return div.Execute(source, nSMFI););

Без самих кэшируемых функций до конца разобраться не получится, но, как минимум, здесь вы неверно кэшируете nSDiv.