In LINQ:
// The strings (it's equivalent to new string[])
var strs = new[] { "acks", "top", "cat", "gr", "by", "bar", "lap", "st", "ely", "ades" };
// We group the strings by length.
var strsByLength = strs.ToLookup(p => p.Length);
// For each string we match the string with all the strings with the "right" length (6 - current string length) and we sum them (p, q) => p + q.
var result = strs.SelectMany(p => strsByLength[6 - p.Length], (p, q) => p + q);
I'm using the ToLookup to make this problem "medium" complexity a little less than O(n^2). Clearly if all the strings are long 3, the problem is still O(n^2).
I'm usign the SelectMany that, alone, is a little advanced LINQ.
I'll add, if you have a dictionary of "good" words, a solution could be this. It's using the dictionary as a black box: you can check if a word is IN the dictionary (technically an HashSet) but you can't directly use the dictionary to help you finding the words.
// The list of good words
var words = new[] { "stacks", "laptop", "grades", "barely" };
// Made in an `HashSet` to make it O(1) to check for them.
var wordsSet = new HashSet<string>(words);
// Here we create a temporary object (p, q) => new { p, q, sum = p + q } containing the two "parts" of the word and the complete word and then we filter the result for only the words contained in the wordsSet.
var result2 = strs.SelectMany(p => strsByLength[6 - p.Length], (p, q) => new { p, q, sum = p + q }).Where(p => wordsSet.Contains(p.sum));