何を議論してるのかさっぱり分からないけど
stringだけを含んだカスタムクラスを作る必要性が出てくるのは
stringが書き換えられないからだよね

foreach(string str in list)
{
 if(str == "b")
  str = d;
}

これはコンパイルすら通らないけど

foreach(CustomClass customClass in list)
{
 if(customClass.Str == "b")
  customClass.Str = d;
}

こうすればlistの中身まで書き換えられる
まあstringだけ含んだクラスなんて作る必要はまずないと思うけど

for(int i = 0; i < list.Count; ++i)
{
 if(list[i] == "b")
  list[i] = d;
}

 素直にfor文書くのが一番