This is not compatible with LocaliserRegistry implementation. 

        public TLocaliser ResolveForCulture(CultureInfo culture)
        {
            culture = culture ?? CultureInfo.CurrentUICulture;

            Lazy<TLocaliser> factory;

            if (_localisers.TryGetValue(culture.Name, out factory))
                return factory.Value;

            if (_localisers.TryGetValue(culture.TwoLetterISOLanguageName, out factory))
                return factory.Value;

            return _defaultLocaliser;
        }

As you see, here we take a formatter from the cache. How would we supply it with culture?

I see your point here about passing actual culture to the formatter, but that means we can not derive FormatterRegistry from LocaliserRegistry anymore. Is this okay? Or should we change LocaliserRegistry to store a dictionary of constructors instead of dictionary of objects (and, thus, create a new formatter each time one is aquired? - is this efficient in general case?).

To be fair, all these considerations were the reason why i passed "culture" object to formatter's methods originally :).