This is not a full answer, but:
String.IndexOf(String) calls CultureInfo.CurrentCulture.CompareInfo.IndexOf, which calls (at least in some of the cases) CompareInfo.SyntheticIndexOf, which, in decompiled pseudo-code, looks like this:
private int SyntheticIndexOf(string source, string value, int start, int length, int nativeCompareFlags)
{
if (CompareInfo.fFindNLSStringSupported >= 0)
{
int num1 = CompareInfo.FindNLSStringWrap(this.m_sortingLCID, nativeCompareFlags | 0x400000, source, start, length, value, value.Length);
if (num1 >= -1)
{
return num1;
}
}
for (int num2 = 0; num2