Console word wrapping
GetBorderedText(string Input, int AbsoluteLength, bool splitLines = true, int Offset = -4)



You are very inconsistent with naming parameters. Some of them are in PascalCase while only one has the correct camelCase. This makes your code look strange and unprofessional.




if (Input.Length &gt; AbsoluteLength + Offset &amp;&amp; splitLines)



Conditions like this are better stored in a variable that describes what its purpose is and split into two. Consider this:

var wrapRequired = input.Length &gt; absoluteLength + offset;
if (wrapRequired &amp;&amp; canWrap)





input.Split(' ').ToList()



You don't need to call ToList, it's already an array and can be enumerated.




foreach (string s in words)



If your collection is called words then name the item word and not s. It's very confusing when one looks at the code and wonders what that s is.




lineConstruction.Length + word.Length + 1 &gt;= absoluteLength + offset



The same here. You should name this condition propertly and especially the magic 1.



Other than this 


you should use StringBuilder for concatenating strings in loops because it's not only faster but also easier to use.
make the border as prefix &amp; suffix parameters instead of hardcoding them (or leftBorder &amp; rightBorder).
use variables with stronger names and use more of them so that they document your code.


As an example of how you can apply all these suggestions here's the new code with one new method for adding the border.

public static string CreateBorderedText(string input, int maxLength, bool canWrap = true, string prefix = "+ ", string suffix = " +")
{
    const string wordSeparator = " ";

    var lines = new List&lt;string&gt;();
    var lineBuilder = new StringBuilder();
    var borderLength = prefix.Length + suffix.Length;
    var contentLength = maxLength - borderLength;

    var wrapRequired = input.Length &gt; contentLength;
    if (wrapRequired &amp;&amp; canWrap)
    {
        var words = input.Split(' ');
        foreach (var word in words)
        {
            var projectedLength = lineBuilder.Length + word.Length + wordSeparator.Length + borderLength;
            var wrap = projectedLength &gt;= maxLength;
            if (wrap)
            {
                PadRight(lineBuilder, contentLength);
                AddBorder(lineBuilder, prefix, suffix);

                lines.Add(lineBuilder.ToString());
                lineBuilder.Clear();                
            }

            lineBuilder.Append(word).Append(wordSeparator);
        }
    }
    else
    {
        lineBuilder.Append(input);      
    }

    PadRight(lineBuilder, contentLength);
    AddBorder(lineBuilder, prefix, suffix);
    lines.Add(lineBuilder.ToString());

    return string.Join(Environment.NewLine, lines);
}


and the two helpers

private static void AddBorder(StringBuilder lineBuilder, string prefix, string suffix)
{
    lineBuilder
        .Insert(0, prefix)
        .Append(suffix);
}

private static void PadRight(StringBuilder lineBuilder, int targetLength)
{
    lineBuilder.Append(' ', targetLength - lineBuilder.Length);
}