Not a very nice solution, but it does what you want it to do with your given example:
private void Form1_Load(object sender, EventArgs e)
{
List<string> lst = new List<string>() { "table", "chair", "hat", "chair", "table", "table", };
Dictionary<string, int> frequencies = new Dictionary<string, int>();
foreach (string item in lst)
{
if (frequencies.ContainsKey(item))
frequencies[item]++;
else
frequencies.Add(item, 1);
}
var sortedDict = (from entry in frequencies orderby entry.Value descending select entry).ToDictionary(pair => pair.Key, pair => pair.Value);
lst.Clear();
foreach (string entry in sortedDict.Keys)
lst.Add(entry);
foreach(string val in lst)
Console.WriteLine(val);
foreach (KeyValuePair<string, int> pair in sortedDict)
Console.WriteLine(pair.Key + " " + pair.Value.ToString() + "pc");
}