Selecting names with two consecutive, same letters
The outer for loop can be replaced with a foreach loop: foreach (var name in names). It removes the need for two counter variables, and simplifies indexing of the array, making the code easier to read.
This method would be more flexible if it accepted a single string and returned a boolean: bool HasRepeatingLetters(string str). That allows you to use it for single names as well as for multiple names.
For multiple names, the above method can easily be combined with Linq: var matchingNames = names.Where(name =&gt; HasRepeatingLetters(name)).ToArray() (you can remove the ToArray (or ToList) call if you want lazy evaluation). In this case, you don't even need an anonymous function, because the signature of HasRepeatingLetters already matches what Where requires: names.Where(HasRepeatingLetters).
Keep in mind that ToLower is culture-dependent (not all languages use the same upper/lowercase conversion rules). You may want to give your function an extra (optional) CultureInfo argument to control its behavior.
Performance of your function should be O(n), not O(n^2). Passing in twice as many strings, or strings that are twice as long, requires twice as much work, not four times as much. It would only be O(n^2) if, for example, you compared each string against every other string.
Calling ToLower on the given string would simplify your code, and it should be a bit faster too for names without repeating characters. You could also keep your for loop, but store the previous lower-cased character as you go, so you don't need to convert it to lower-case twice. That would make the code a little more complicated, so it's probably not worth the hassle. Of course, if performance is important, you should actually measure it.