Как правильно парсить текс в таких условиях?
Строка это массив символов. 

1. С помощью метода IndexOf() ищем первое вхождение символов ‘{‘ и ‘}’
2. С помощью метода SubString() сохраняем текст между найденными индексами. 
3. Возвращаемся к пункту 1, но поиск начинаем с символа идущего после ‘}’.
4. Повторяем пока один из методов IndexOf() не вернет -1.

А вообще для решения данной задачи лучше покурить регулярки.

Если лень
Рефакторить и рефакторить, но работает =)

private static List<string> ParseString(string input)
        {
            List<string> result = new List<string>();

            int openIndex = input.IndexOf('{');
            int closeIndex = input.IndexOf('}');

            while (openIndex != -1 && closeIndex != -1)
            {
                result.Add(input.Substring(openIndex, closeIndex - openIndex + 1));
                
                input = input.Substring(closeIndex + 1);

                openIndex = input.IndexOf('{');
                closeIndex = input.IndexOf('}');
            }

            return result;
        }

+ вариант через регулярку Взято отсюда

private static List<string> ParseStringRegex(string input)
        {
            Regex regex = new Regex(@"{([\s\S]+?)}", RegexOptions.Compiled | RegexOptions.IgnoreCase);

            var matches = regex.Matches(input);

            return matches.Select(m => m.Value).ToList();
        }

Строка это массив символов. 

1. С помощью метода IndexOf() ищем первое вхождение символов ‘{‘ и ‘}’
2. С помощью метода SubString() сохраняем текст между найденными индексами. 
3. Возвращаемся к пункту 1, но поиск начинаем с символа идущего после ‘}’.
4. Повторяем пока один из методов IndexOf() не вернет -1.

А вообще для решения данной задачи лучше покурить регулярки.

Если лень
Рефакторить и рефакторить, но работает =)

private static List<string> ParseString(string input)
        {
            List<string> result = new List<string>();

            int openIndex = input.IndexOf('{');
            int closeIndex = input.IndexOf('}');

            while (openIndex != -1 && closeIndex != -1)
            {
                result.Add(input.Substring(openIndex, closeIndex - openIndex + 1));
                
                input = input.Substring(closeIndex + 1);

                openIndex = input.IndexOf('{');
                closeIndex = input.IndexOf('}');
            }

            return result;
        }

+ вариант через регулярку Взято отсюда

private static List<string> ParseStringRegex(string input)
        {
            Regex regex = new Regex(@"{([\s\S]+?)}", RegexOptions.Compiled | RegexOptions.IgnoreCase);

            var matches = regex.Matches(input);

            return matches.Select(m => m.Value).ToList();
        }
