This code works fine
    [Test]
    public void boo()
    {
        var collection = new[] { 1, 2, 3 };
        collection.Should().Equal(1, 2, 3);
    }
But, this fails
    [Test]
    public void foo()
    {
        var collection = new[] { "1", "2", "3" };
        collection.Should().Equal("1", "2", "3");            
    }
The failure message is:
'Expected collection to be equal to {1} because 2, but {"1", "2", "3"} contains 2 item(s) too many.'
What is wrong here? Why enumerable of string could not be compared?
And, of cause, my question is - how to handle case in foo() ?
                        
This happens because the compiler selects the wrong overload of Equals() because of limitations in C#. In your particular case, it's taking the Equals(string expected, string reason, params string[] args), instead of Equals(IEnumerable). I have never found an easy way to solve this ambiguity in FluentAssertions.
To solve your problem, wrap the expected values in an array.