No ordena entradas en el Diccionario. La clase de diccionario en .NET se implementa como una tabla hash: esta estructura de datos no se puede ordenar por definición.
Si necesita poder iterar sobre su colección (por clave), debe usar SortedDictionary, que se implementa como un árbol de búsqueda binario.
En su caso, sin embargo, la estructura fuente es irrelevante, ya que está ordenada por un campo diferente. Aún necesitaría ordenarlo por frecuencia y colocarlo en una nueva colección ordenada por el campo relevante (frecuencia). Entonces, en esta colección, las frecuencias son claves y las palabras son valores. Dado que muchas palabras pueden tener la misma frecuencia (y la va a usar como una clave), no puede usar ni Dictionary ni SortedDictionary (requieren claves únicas). Esto te deja con una SortedList.
No entiendo por qué insiste en mantener un enlace al elemento original en su diccionario principal / primer.
Si los objetos en su colección tuvieran una estructura más compleja (más campos) y necesitara poder acceder / ordenarlos eficientemente usando varios campos diferentes como claves, probablemente necesitaría una estructura de datos personalizada que consistiría en el almacenamiento principal que admite la inserción y eliminación de O (1) (LinkedList) y varias estructuras de indexación: Diccionarios / SortedDictionaries / SortedLists. Estos índices utilizarían uno de los campos de su clase compleja como clave y un puntero / referencia al LinkedListNode en LinkedList como valor.
Tendría que coordinar las inserciones y eliminaciones para mantener sus índices sincronizados con la colección principal (LinkedList) y las eliminaciones serían bastante caras, creo. Esto es similar a cómo funcionan los índices de base de datos: son fantásticos para las búsquedas, pero se convierten en una carga cuando necesita realizar muchas inserciones y eliminaciones.
Todo lo anterior solo se justifica si va a realizar un procesamiento pesado de búsqueda. Si solo necesita generarlos una vez ordenados por frecuencia, entonces podría producir una lista de tuplas (anónimas):
var dict = new SortedDictionary<string, int>();
// ToDo: populate dict
var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();
foreach (var entry in output)
{
Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}
IComparer
que haga el truco (es cierto que acepta una clave para comparar, pero con una clave, puede obtener un valor). ;-)