Coleta de dicionário aninhada no .NET

A redeDictionary<TKey, TValue> objeto permite a atribuição de chave / valores como:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict["1"] = "foo";
dict["2"] = "bar";

mas eu não posso usar um dicionário assim:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict["F1"]["F2"]["F3"] = "foo";
dict["2"]["X"] = "bar";

Existe uma coleção no .net que me permite aninhar[], ou eu teria que criar o meu próprio?

Se eu tiver que criar o meu próprio, como eu faria isso?

EDITAR:

Também seria útil se eu pudesse ter implementações que esperam chaves exclusivas, da seguinte forma:

dict["F1"]["F2"]["F3"] = "foo";
dict["F1"]["F2"]["F3"] = "bar"; //result is "bar" because "foo" was overridden

e uma implementação onde uma chave pode ser usada mais de uma vez

dict["F1"]["F2"]["F3"] = "foo";
dict["F1"]["F2"]["F3"] = "bar"; //result can be "foo" and "bar"

Isso é possível?

EDIT (conforme a pergunta de Jon Skeet):

Eu quero usar a estrutura assim (como um exemplo muito grosseiro):

json["data"]["request"]["name"] = "username";
json["data"]["request"]["pass"] = "password";

resolve

{ data: { request: { name: "username", pass: "password" } } }

e igualmente haveria um equivalente para XML etc.

questionAnswers(6)

yourAnswerToTheQuestion