Trie-based spell checker
The trie creation could by very pretty if you made it an extension then can call it on the array:

var trie = new string[] 
{
    "trainee",
    "train",
    "tree"
}
.ToTrie();


The method itself can be simplified. You can use foreach to get rid of the indexes (unless performance really, really, really matters).

Sometimes it's also prettier to use the TryGetValue + else where you can assign all values in a single line to avoid duplication like:


    currentNode.Children[character] = new Node();     
}
currentNode = currentNode.Children[character];



To my taste it doesn't look nice. Instead I suggest this where I also use currentNode instead of just node which I find is easier to understand.

public static Node ToTrie(this string[] values)
{
    var root = new Node();
    foreach (var value in values)
    {
        var currentNode = root;
        foreach (var c in value)
        {
            var node = (Node)null;
            if (currentNode.TryGetValue(c.ToString(), out node))
            {
                currentNode = node;
            }
            else
            {
                currentNode = (currentNode[c.ToString()] = new Node());
            }
        }
        currentNode.IsWord = true;
    }
    return root;
}


The Node can actually be simplified too by deriving it from a dictionary. By adding the search method to it you can easily use it on any node. I named it Contains.

Another adjustment you can make is to use string instead of the char so you can use one of the construtor overloads of the dictionary and make it case insensitive. This way you won't need the ToLower.

public class Node : Dictionary&lt;string, Node&gt;
{
    public Node() : base(StringComparer.OrdinalIgnoreCase) {}

    public bool IsWord { get; set; }

    public bool Contains(string value)
    {
        var currentNode = this;
        foreach (var c in value)
        {
            var node = (Node)null;
            if (currentNode.TryGetValue(c.ToString(), out node))
            {
                currentNode = node;
            }
            else
            {
                return false;
            }
        }
        return currentNode.IsWord;
    }
}


Usage:

var result1 = trie.Contains("train"); // True
var result2 = trie.Contains("TraINE"); // False
var result3 = trie.Contains("TRAINEE"); // True