Your example seems fine to me.
> Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3
Unfortunately, pure RegEx can't keep track of which nesting level you are on, so it won't know where to put the /UL close tags.
Something like this might work:
* Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3
Here, the greater-than and less-than move up and down the hierarchy, and the asterisks are the delimiters for the bullets. The spaces before and after each are used as a sort of escape sequence, so you can still use those characters literally or for other purposes like italics and bold when they aren't surrounded by spaces.
A stab at the RegEx:
string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
ol = RegEx.Replace(ol, " < ", "</ul>");
ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>");
Edit: Adjusted to produce XHTML, closing the LI tags, based on comment below. Also fixed my C# syntax.
Final edit: I think the \ * and \ 2 in the last Replace need to be escaped for C#, fixing. Also, note that the first two Replace() calls can use String.Replace() rather than RegEx, which will likely be faster.