First, You have an extraneous closing parenthesis at the end of your $block declaration:
var $block = ... "</div>");
This would stop the whole page from working.
Second, if you use a context as part of the live(), then the context has to be a single DOM elemnt.... it cannot be a string. To create a single DOM element, simply make use of jQuery ( $block = $("...");, so you should do:
var $block =$("<div class='task-create-content' >"+
"<div class='task-create-preview'>"+
"<div class='items'>" +
"<div><input type='text' class='edit wtp'/></div>" +
"<div><input type='text' class='edit wtp'/></div>" +
"</div>"+
"</div>");
Then when you refer to $block you will be referring to a DOM element. The context cannot simply be $block, since you want to bind the click function to a $block that is actually on the page in question, so you have to specify which $block/s. To do this use $(".wtp", $block[0]).
$(".wtp", $block[0]).live('click',function() {
alert("hi");
})
I pick as the context the first $block in the DOM. You can substitute a variable for the index or do this some other way.
working jsFiddle example
Working with clones
Instead of using live(), I would use bind() to work with clones... like this:
Remember that $block must be a DOM element in this case too, so you have to define $block like:
$block = $(" ... ");
Then you can use and clone $block like this:
$(".wtp", $block).bind('click',function() {
alert("hi");
})
$($block).clone(true).appendTo("body");
// Let's change $block dynamically!
$("<div>Dynamic!</div>").appendTo($block);
$($block).clone(true).appendTo("body");
Make sure you include true when you clone so that you indicate that the event handlrs should be copied too.
jsFiddle example